package com.rengwuxian.coursecoroutines._3_scope_context

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlin.coroutines.EmptyCoroutineContext

/**
 * 再谈withContext()
 * withContext()、coroutineScope()、launch()、async()
 *
 * withContext(){
 * }
 * 和 coroutineScope()更像，只是后者不能填参数来定制CoroutineContext.
 * 和coroutineScope的区别，就是可以填写coroutineContext的参数。（源码可对比）
 *
 * withContext(EmptyCoroutineContext) {} 和 coroutineScope{} 等价
 *
 * withContext(){} 用来启动串行的协程的。表面上（写法上）不用开启协程，但底层逻辑也是开了协程。
 *
 * withContext(){} 就是一个可以定制coroutineContext的coroutineScope{}函数
 * withContext(){} 相当于一个串行的launch 或者 async
 * 在具体开发的时候遇到：临时切换coroutineContext的，就可以使用它。
 */
fun main() = runBlocking<Unit> {
  val scope = CoroutineScope(EmptyCoroutineContext)
  scope.launch {
    withContext(coroutineContext) {

    }
    coroutineScope {

    }
  }
  delay(10000)
}